<?php

use Symfony\Component\Yaml\Yaml;

require_once("dao/CdrFixeDao.php");
require_once("dao/DetailClientDao.php");

if ($_SESSION['niveauAuth'] == '1' or $_SESSION['niveauAuth'] == '2' or $_SESSION['niveauAuth'] == '3'or $_SESSION['niveauAuth'] == '4'or $_SESSION['niveauAuth'] == '5'or $_SESSION['niveauAuth'] == '6'or $_SESSION['niveauAuth'] == '7' or $_SESSION['niveauAuth'] == '8') {
    //récupération de la conf de matching
    $cdrConfFull = Yaml::parse(__DIR__ . '/../../conf/cdr-matching.yml');
    if ($_POST) {
        $cdrConf = $cdrConfFull[$_POST['import-cdr']];

        //recherche des fichiers dans le repertoire
        $pathSearch = sprintf(
                '%s%s/*.csv', MM_CDR_PATH, $cdrConf['import_directory']
        );
        $files      = glob($pathSearch);
        rsort($files);
        $file       = $files[0];

        if ('mobile' !== $cdrConf['import_directory'] && 'fax' !== $cdrConf['import_directory']) {
            $i             = 0; // compteur de ligne
            $usersNotFound = 0;
            $fic           = fopen($file, "a+");
            $data          = array();
            //traitement
            $header        = null;
            try {
                while ($row = fgetcsv($fic, 1024, $cdrConf['delimiter'])) {
                    //entête
                    if ($header === null) {
                        // si le type du premier matching est int, on assumme que le reste n'aura pas de header non plus
                        if (is_int($cdrConf['matching']['caller_num']['col'])) {
                            $header = 'numeric';
                        } else {
                            $header = $row;
                            continue;
                        }
                    }
                    //si header
                    if ($header !== 'numeric') {
                        if (!$row = array_combine($header, $row)) {
                            throw new Exception("Impossible de construire l'entête des données, vérifiez que le fichier correspond bien à la configuration requise.");
                        } elseif (1 === count($row)) {
                            throw new Exception(sprintf("Le séparateur de colonne semble être invalide. Vérifiez qu'il est bien sous forme \"%s\".", $cdrConf['delimiter']));
                        }
                    }
                    //type
                    $data[$i] = array(
                        'type' => $_POST['import-cdr']
                    );
                    foreach ($cdrConf['matching'] as $key => $value) {
                        // donnée crue
                        $colData = '';
                        if (is_array($value['col'])) { // si la colonne de matching est un tableau, merge des données
                            foreach ($value['col'] as $col) {
                                $colData .= $row[$col];
                            }
                        } else {
                            $colData = $row[$value['col']];
                        }
                        //traitement du type
                        if (!empty($value['type'])) {
                            switch ($value['type']) {
                                case 'datetime':
                                    $format  = $value['format'];
                                    $colData = DateTime::createFromFormat($format, $colData);
                                    //control que $colData est bien un datetime
                                    if (!$colData instanceof DateTime) {
                                        throw new Exception("Impossible de construire une date au format '$format', avec la donnée '$colData'. Vérifiez les données du fichier et la configuration.");
                                    }
                                    break;
                                case 'timestamp':
                                    $colData = new DateTime($colData);
                                    break;
                                default:
                                    break;
                            }
                        }
                        // Formatting numéro d'appelant
                        if ('caller_num' === $key) {
                            $colData = '33' . substr($colData, -9);
                        }
                        // Formatting numéro d'appelé, ajout de "33" si numéro pas international
                        if ('called_num' === $key and strlen($colData) < 11) {
                            $colData = '33' . substr($colData, -9);
                        }

                        $data[$i][$key] = $colData;
                    }
                    $detailClient = null;
                    // Recherche du client associé

                    if (!empty($cdrConf['user_matching'])) {
                        $userCol    = $cdrConf['user_matching'][0];
                        $csvCol     = $cdrConf['user_matching'][1];
                        $matchValue = $row[$csvCol];

                        //récupération du detail client
                        $detailClient = DetailClientDao::findOne("$userCol = '$matchValue'");
                    } else {
                        $userCol = 'tel_fix';
                        $csvCol  = $cdrConf['matching']['caller_num']['col'];

                        //récupération du detail client
                        $detailClient = DetailClientDao::searchByTelNumber($row[$csvCol]);
                    }
                    if (!empty($detailClient)) {
                        $data[$i]['id_detail_client'] = $detailClient['id'];
                        $i++;
                    } else {
                        unset($data[$i]);
                        $usersNotFound++;
                    }
                }
                $ret = null;
                if (!empty($data)) {
                    $ret = CdrFixeDao::insertBunch($data);
                }
                if ($ret === true) {
                    $message = $i . " lignes insérées";
                } elseif ($ret === -1) {
                    $error = "Ce fichier a déjà été importé ce mois-ci.";
                } else {
                    $error = "Le fichier ne s'est pas importé";
                }

                if ($usersNotFound > 0) {
                    $error = "$usersNotFound lignes n'ont pas pu êtres associées à un utilisateur ! Vérifiez vos données."; //@todo afficher un détail

                    if (empty($data)) {
                        $error .= " Le fichier n'a pas été importé";
                    }
                }
            } catch (Exception $exc) {
                $error = $exc->getMessage();
            }
        }

//OLD
        /* if (strstr($file, "voip")) {

          //insertion voip TO
          $requete = $bdd->prepare("TRUNCATE TABLE cdr_voip");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;
          $req    = $bdd->prepare('INSERT INTO cdr_voip(id_client,date_heure,appelant,appele,pays,temps_seconde)
          VALUES(:id_client, :date_heure, :appelant, :appele, :pays, :temps_seconde)');

          if ($tab[0] <> "ID Client") {
          if (strlen($tab[3]) == 10 and strstr($tab[3], "0")) {
          $req->execute(array(
          'id_client'     => $tab[0],
          'date_heure'    => $tab[1],
          'appelant'      => $tab[2],
          'appele'        => substr($tab[3], 1),
          'pays'          => $tab[4],
          'temps_seconde' => $tab[5],
          ));
          } else {
          $req->execute(array(
          'id_client'     => $tab[0],
          'date_heure'    => $tab[1],
          'appelant'      => $tab[2],
          'appele'        => $tab[3],
          'pays'          => $tab[4],
          'temps_seconde' => $tab[5],
          ));
          }
          }
          }
          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          }

          //insertion voip ovh
          /*else if (strstr($file, "voip_ovh")) {

          $requete = $bdd->prepare("TRUNCATE TABLE cdr_voip_ovh");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;
          $req    = $bdd->prepare('INSERT INTO cdr_voip_ovh(phoneLine,datetime,duration,calledNumber,nature,type,destination,)
          VALUES(:phoneLine, :datetime, :duration, :calledNumber, :nature, :type, :destination)');

          if ($tab[0] <> "phoneLine") {
          if (strlen($tab[3]) == 10 and strstr($tab[3], "0")) {
          $req->execute(array(
          'phoneLine'   => $tab[0],
          'datetme'     => $tab[1],
          'duration'    => $tab[2],
          'calleNumber' => substr($tab[3], 1),
          'nature'      => $tab[4],
          'type'        => $tab[5],
          'destination' => $tab[6],
          ));
          } else {
          $req->execute(array(
          'phoneLine'   => $tab[0],
          'datetme'     => $tab[1],
          'duration'    => $tab[2],
          'calleNumber' => $tab[3],
          'nature'      => $tab[4],
          'type'        => $tab[5],
          'destination' => $tab[6],
          ));
          }
          }
          }
          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          }

          //insertion	vga TO
          else if (strstr($file, "vga")) {
          $requete = $bdd->prepare("TRUNCATE TABLE cdr_vga");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;

          if (strlen($tab[0]) == 11 && strlen($tab[1]) == 11 && strpos($tab[0], "'") == 0) {
          $req = $bdd->prepare('INSERT INTO cdr_vga(ndi,sda,appele,date_heure,temps_seconde,pays,code_destination)
          VALUES(:ndi, :sda, :appele, :date_heure, :temps_seconde,:pays,:code_destination)');
          $req->execute(array(
          'ndi'              => $tab[0],
          'sda'              => $tab[1],
          'appele'           => substr($tab[2], 2),
          'date_heure'       => $tab[3],
          'temps_seconde'    => $tab[5],
          'pays'             => $tab[6],
          'code_destination' => $tab[7]
          ));
          }
          }

          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          }

          //insertion	vga BT
          else if (strstr($file, "vga_bt")) {
          $requete = $bdd->prepare("TRUNCATE TABLE cdr_vga_bt");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;

          if (strlen($tab[0]) == 11 && strlen($tab[1]) == 11 && strpos($tab[0], "'") == 0) {
          $req = $bdd->prepare('INSERT INTO cdr_vga_bt(appelant,date,destination,appeler,temps_seconde)
          VALUES(:appelant, :date, :destinantion, :appeler, :temps_seconde)');
          $req->execute(array(
          'appelant'      => $tab[0],
          'date'          => $tab[1],
          'destination'   => $tab[2],
          'appeler'       => $tab[3],
          'temps_seconde' => $tab[5],
          ));
          }
          }

          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          }

          //insertion	vga rezo
          else if (strstr($file, "vga_rezo")) {
          $requete = $bdd->prepare("TRUNCATE TABLE cdr_vga_rezo");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;

          if (strlen($tab[0]) == 11 && strlen($tab[1]) == 11 && strpos($tab[0], "'") == 0) {
          $req = $bdd->prepare('INSERT INTO cdr_vga_rezo(ndi,sda,appele,date_heure,temps_seconde,pays,code_destination)
          VALUES(:ndi, :sda, :appele, :date_heure, :temps_seconde,:pays,:code_destination)');
          $req->execute(array(
          'ndi'              => $tab[0],
          'sda'              => $tab[1],
          'appele'           => substr($tab[2], 2),
          'date_heure'       => $tab[3],
          'temps_seconde'    => $tab[5],
          'pays'             => $tab[6],
          'code_destination' => $tab[7]
          ));
          }
          }

          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          }

          //insertion	vga orange
          else if (strstr($file, "vga_origyne")) {
          $requete = $bdd->prepare("TRUNCATE TABLE cdr_vga_origyne");
          $requete->execute();
          $ligne   = 1; // compteur de ligne
          $fic     = fopen($file, "a+");
          while ($tab     = fgetcsv($fic, 1024, ';')) {
          $champs = count($tab); //nombre de champ dans la ligne en question
          $ligne ++;

          if (strlen($tab[0]) == 11 && strlen($tab[1]) == 11 && strpos($tab[0], "'") == 0) {
          $req = $bdd->prepare('INSERT INTO cdr_vga_origyne(callref,date,time,clientref,clientname,caller,subcaller,called,countryref,during)
          VALUES(:callref, :date, :time, :clientref, :clientname,:caller,:subcaller,:called,:countryref,:during)');
          $req->execute(array(
          'callref'    => $tab[0],
          'date'       => $tab[1],
          'time'       => substr($tab[2], 2),
          'clientref'  => $tab[3],
          'clientname' => $tab[5],
          'caller'     => $tab[6],
          'subcaller'  => $tab[7],
          'called'     => $tab[8],
          'countryref' => $tab[10],
          'during'     => $tab[11]
          ));
          }
          }

          if ($req) {
          $message = $ligne . " lignes d'insérées";
          } else {
          $error = "le fichier ne s'est pas importer";
          }
          } */
        //insertion	mobile
        elseif ('mobile' == $cdrConf['import_directory']) {
            $requete = $bdd->prepare("TRUNCATE TABLE cdr_mobile");
            $requete->execute();
            $ligne   = 1; // compteur de ligne
            $fic     = fopen($file, "a+");
            while ($tab     = fgetcsv($fic, 1024, ';')) {
                $champs = count($tab); //nombre de champ dans la ligne en question
                $ligne ++;
                if ($tab[0] <> "SubscriberNumber") {
                    $req = $bdd->prepare('INSERT INTO cdr_mobile(SubscriberNumber,LastName,FirstName,RatePlan,Msisdn,RecordDate,SourceId,CallType,StartDate,StartTime,Duration,ChargeBand,Charge,CallingNumber,DialedNumber,CountryCode,NumberType,Location,DestinationOrigin,TalkPlanInclusion,ChargeBeforeTalkPLan,TalkplanName)
                    VALUES(:SubscriberNumber, :LastName, :FirstName, :RatePlan, :Msisdn, :RecordDate, :SourceId, :CallType, :StartDate, :StartTime, :Duration, :ChargeBand, :Charge, :CallingNumber, :DialedNumber, :CountryCode, :NumberType, :Location, :DestinationOrigin, :TalkPlanInclusion, :ChargeBeforeTalkPLan, :TalkplanName)');
                    $req->execute(array(
                        'SubscriberNumber'     => $tab[0],
                        'LastName'             => $tab[1],
                        'FirstName'            => $tab[2],
                        'RatePlan'             => $tab[3],
                        'Msisdn'               => $tab[4],
                        'RecordDate'           => $tab[5],
                        'SourceId'             => $tab[6],
                        'CallType'             => $tab[7],
                        'StartDate'            => $tab[8],
                        'StartTime'            => $tab[9],
                        'Duration'             => $tab[10],
                        'ChargeBand'           => $tab[11],
                        'Charge'               => $tab[12],
                        'CallingNumber'        => $tab[13],
                        'DialedNumber'         => $tab[14],
                        'CountryCode'          => $tab[15],
                        'NumberType'           => $tab[16],
                        'Location'             => $tab[17],
                        'DestinationOrigin'    => $tab[18],
                        'TalkPlanInclusion'    => $tab[19],
                        'ChargeBeforeTalkPLan' => $tab[20],
                        'TalkplanName'         => $tab[21]
                    ));
                }
            }
            if ($req) {
                $message = $ligne . " lignes d'insérées";
            } else {
                $error = "le fichier ne s'est pas importer";
            }
        }

        //insertion fax
        elseif ('fax' == $cdrConf['import_directory']) {
            $requete = $bdd->prepare("TRUNCATE TABLE cdr_fax");
            $requete->execute();
            $ligne   = 1; // compteur de ligne
            $fic     = fopen($file, "a+");
            while ($tab     = fgetcsv($fic, 1024, ';')) {
                $champs = count($tab); //nombre de champ dans la ligne en question
                $ligne ++;
                $req    = $bdd->prepare('INSERT INTO cdr_fax(idclient,date_heure,numero_source,numero_destination,sens,nbr_page)
                                        VALUES(:idclient, :date_heure, :numero_source, :numero_destination, :sens, :nbr_page)');

                if ($tab[0] <> "ID Client") {
                    if (strlen($tab[3]) == 10 and strstr($tab[3], "0")) {
                        $req->execute(array(
                            'idclient'           => $tab[0],
                            'date_heure'         => $tab[1],
                            'numero_source'      => $tab[2],
                            'numero_destination' => substr($tab[3], 1),
                            'sens'               => $tab[4],
                            'nbr_page'           => $tab[5],
                        ));
                    } else {
                        $req->execute(array(
                            'idclient'           => $tab[0],
                            'date_heure'         => $tab[1],
                            'numero_source'      => $tab[2],
                            'numero_destination' => $tab[3],
                            'sens'               => $tab[4],
                            'nbr_page'           => $tab[5],
                        ));
                    }
                }
            }

            if ($req) {
                $message = $ligne . " lignes d'insérées";
            } else {
                $error = "le fichier ne s'est pas importer";
            }
        }
    }
    echo $twig->render('chargement-cdr.html.twig', array('message'  => $message,
        'ligne'    => $i,
        'error'    => $error,
        'cdr_conf' => $cdrConfFull));
} else {
    redirect("home-admin");
}
